#include "compat/min_heap.h"
#include "compat/queue.h"
#include <time.h>
#ifndef __EVENT_INTERNAL_H
#define __EVENT_INTERNAL_H
#define COMMON_TIMEOUT_MICROSECONDS_MASK 0x000fffff
#define ev_io_timeout _ev.ev_io.ev_timeout
#define ev_ncalls _ev.ev_signal.ev_ncalls
#define ev_pncalls _ev.ev_signal.ev_pncalls

/******************* 执行回调函数的行文定义 ************/
// 默认行为
#define EV_CLOSURE_NONE 0
// 执行信号事件回调函数的时候，调用ev.ev_siganl.ev_ncalls次回调函数
#define EV_CLOSURE_SIGANL 1
// 执行完回调函数后，再次将事件处理器加入注册事件队列
#define EV_CLOSURE_PERSIST 2

/******************** 线程锁的定义 ************************/

// 默认支持多线程结构

#define event_io_map event_signal_map
struct event_signal_map
{
    /* An array of evmap_io * or of evmap_signal *; empty entries are
     * set to NULL. */
    void **entries;
    /* The number of entries available in entries */
    int nentries;
};

// I/O事件队列
struct evmap_io
{
    struct event_list events;
    ev_uint16_t nread;
    ev_uint16_t nwrite;
};
// 信号事件队列
struct evmap_signal
{
    struct event_list events;
};

// 封装io复用机制的一些必要操作
struct eventop
{
    // 后端io复用技术的名称
    const char *name;
    // 初始化函数
    void *(*init)(struct event_base *);
    // 注册事件
    int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    // 删除事件
    int (*del)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    // 等待事件
    int (*dispatch) (struct event_base *,struct timeval *);
    // 释放io复用机制使用的资源
    void (*dealloc)(struct event_base *);
    // 程序调用fork之后是否需要重新初始化event_base
    int need_reinit;
    // 有的I/0复用机制需要为每个I/0事件队列和信号事件队列分配额外的内存. 以避免同一个文件措述符被重复插入I/0复用机制的事件表中. 
    //evmap_io_add(或 evmap_io_del) 函数在调用eventop的add(或del)方法时, 将这段内存的起始地址作为第5个参数传递给add(或 del)方法 . 
    // 下面这个成员则指定了这段内存的长度
    size_t fdinfo_len;
};

struct event_base
{
    // 初始化Reactor之后选择一种I/O复用机制 记录在如下字段中
    const struct eventop *evsel;
    // 线程锁结构
    // 暂时先不做锁
    // void *th_base_lock;
    // 时间堆
    struct min_heap timeheap;
    // 添加到event_base中的所有虚拟事件 所有事件和激活事件的数量
    int virtual_event_count;
    int event_count;
    int event_count_active;

    //注册事件队列
    struct event_list eventqueue;
    // 活动事件队列数组 索引越小的队列优先级越高
    struct event_list *activequeues;
    // 管理通用定时器队列定时
    struct common_timeout_list **common_timeout_queues;
    int n_common_timeouts;
    int n_common_timeouts_allocated;
    // 管理系统时间的成员
    struct timeval event_tv;
    struct timeval tv_cache;

    // 文件描述符和io事件之间的映射关系表
    struct event_io_map io;
};

// 通用事件队列
struct common_timeout_list
{
    // 当前在通用时间队列中的事件队列
    struct event_list events;
    // 当前事件的持续事件
    struct timeval duration;
    // 事件发生时激发的队列
    struct event timeout_event;
    // 事件基类
    struct event_base *base;
};

#endif